bitkeeper revision 1.1159.1.358 (418978baFzv03HdTaa43BJsoKTl3dA)
authormwilli2@equilibrium.research <mwilli2@equilibrium.research>
Thu, 4 Nov 2004 00:32:58 +0000 (00:32 +0000)
committermwilli2@equilibrium.research <mwilli2@equilibrium.research>
Thu, 4 Nov 2004 00:32:58 +0000 (00:32 +0000)
Better fix for popen.  Also makes it easier to log stderr output
from popen'd commands, which we previously threw away.  For now,
I'm also throwing it away.

tools/python/xen/sv/Daemon.py
tools/python/xen/util/ip.py
tools/python/xen/xend/server/SrvDaemon.py
tools/python/xen/xend/server/blkif.py
tools/python/xen/xend/util.py

index 8aeb58720e48fb0cb5fdaf7cbc2d6865e495bbef..164a0b165647ce59cd8234571bc1bdc99048631c 100644 (file)
@@ -30,7 +30,7 @@ class Daemon:
         cmdex = '(?P<cmd>.*)'
         procre = re.compile('^\s*' + pidex + '\s*' + pythonex + '\s*' + cmdex + '$')
         xendre = re.compile('^/usr/sbin/xend\s*(start|restart)\s*.*$')
-        procs = util.popen('ps -e -o pid,args 2>/dev/null')
+        procs = util.popen('ps -e -o pid,args')
         for proc in procs:
             pm = procre.match(proc)
             if not pm: continue
@@ -58,7 +58,7 @@ class Daemon:
             return 0
         # Read the pid of the previous invocation and search active process list.
         pid = open(PID_FILE, 'r').read()
-        lines = util.popen('ps ' + pid + ' 2>/dev/null').readlines()
+        lines = util.popen('ps ' + pid).readlines()
         for line in lines:
             if re.search('^ *' + pid + '.+xensv', line):
                 if not kill:
index d130f194211d1db56c8a7344144698d5eaf68c83..855a517f508722305a523ba736c48bab71bf4ec3 100644 (file)
@@ -51,7 +51,7 @@ def get_current_ipaddr(dev='eth0'):
 
     returns interface address as a string
     """
-    fd = util.popen( '/sbin/ifconfig ' + dev + ' 2>/dev/null' )
+    fd = util.popen( '/sbin/ifconfig ' + dev )
     lines = _readlines(fd)
     for line in lines:
         m = re.search( '^\s+inet addr:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*',
@@ -69,7 +69,7 @@ def get_current_ipmask(dev='eth0'):
 
     returns interface netmask as a string
     """
-    fd = util.popen( '/sbin/ifconfig ' + dev + ' 2>/dev/null' )
+    fd = util.popen( '/sbin/ifconfig ' + dev )
     lines = _readlines(fd)
     for line in lines:
         m = re.search( '^.+Mask:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*',
index ea813965ce35a7dcc6cd2d766832cba0e861cab5..34a24ea6b7b1406caf55f6ed2253e7c6ac2bf24d 100644 (file)
@@ -337,7 +337,7 @@ class Daemon:
         cmdex = '(?P<cmd>.*)'
         procre = re.compile('^\s*' + pidex + '\s*' + pythonex + '\s*' + cmdex + '$')
         xendre = re.compile('^/usr/sbin/xend\s*(start|restart)\s*.*$')
-        procs = util.popen('ps -e -o pid,args 2>/dev/null')
+        procs = util.popen('ps -e -o pid,args')
         for proc in procs:
             pm = procre.match(proc)
             if not pm: continue
@@ -383,7 +383,7 @@ class Daemon:
         """
         running = 0
         if pid:
-            lines = util.popen('ps %d 2>/dev/null' % pid).readlines()
+            lines = util.popen('ps %d' % pid).readlines()
             exp = '^ *%d.+%s' % (pid, name)
             for line in lines:
                 if re.search(exp, line):
index df326134704f9693353706901d4c8e16f1b071d2..c8d7032fce5b060b937ebca3f9a0b9586b72f8e3 100755 (executable)
@@ -26,7 +26,7 @@ def expand_dev_name(name):
 def check_mounted(self, name):
     mode = None
     name = expand_dev_name(name)
-    lines = util.popen('mount 2>/dev/null').readlines()
+    lines = util.popen('mount').readlines()
     exp = re.compile('^' + name + ' .*[\(,]r(?P<mode>[ow])[,\)]')
     for line in lines:
         pm = exp.match(line)
index 111d8cd011bd5e303bb2624ad5768142c9adde5f..fcce7bc1fa375876d03c6177ab4e9ad58e490859 100644 (file)
@@ -3,9 +3,12 @@
 
 from twisted.internet import utils
 from twisted.internet import reactor
+from twisted.internet import protocol
 from XendLogging import log
 from StringIO import StringIO
 
+import os
+
 # This is rather distasteful.  Twisted doesn't play nicely with Python's
 # standard os.popen, so here's an implementation of a synchronous popen that
 # should work reliably. - MAW
@@ -14,22 +17,30 @@ def popen(cmd):
 
     done_flag = False
     result = ''
-    
-    def done(output):
-        global done_flag, result
-        done_flag = True
-        result = output
-
-    def err(output):
-        global done_flag
-# For normal use, suppress debug output here.  It grumbles about stderr if the
-# program exits with $? != 0, even if stderr is redirected.  Grrr!
-#        log.debug("util.popen(\'%s\'): %s" % (cmd, output))
-        done_flag = True
-
-    d = utils.getProcessOutput(cmd)
-    d.addCallbacks(done, err)
 
+    class PopenProtocol(protocol.ProcessProtocol):
+        def connectionMade(self):
+            self.transport.closeStdin() # we don't want stdin
+        def outReceived(self, data):
+            global result
+            result = result + data
+#        def errReceived(self, errdata):
+#            log.debug("popen: %s" % errdata)
+        def processEnded(self,status_obj):
+            code = status_obj.value.exitCode
+            if code:
+                # todo: Should consider throwing an exception here.
+                log.debug("popen: process exit with code %d" % code)
+            global done_flag
+            done_flag = True
+
+    # using cmd.split is quick and dirty.  OK as long as people don't try anything
+    # tricky with quotes, etc.
+    args = cmd.split(' ')
+    reactor.spawnProcess(PopenProtocol(), args[0], args, os.environ)
+
+    # Ick!  Sit and ask the reactor to do IO, until the process finishes.
+    # Can't just do "pass" here because then the reactor won't run at all :-(
     while not done_flag:
         reactor.iterate()